最传统的 for 循环
关键在: 终止条件是遍历开始前确定的, 还是在每次遍历中去计算值的.
1. 遍历开始前就确定了终止条件
1 | const arr = [1, 2], len = arr.length; |
2. 每次遍历判定是否终止时, 获取终止条件
1 | const arr = [1, 2]; |
Array.forEach
遍历开始前就确定了遍历次数
1 | const arr = [1, 2]; |
传给 callback 的值是执行那一刻的值, 在 callback 执行中进行的修改只能影响之后的遍历
1 | // 前一次遍历的 insert 影响下一次遍历的取值 |
1 | // 更改当前遍历项的值无法在遍历当次体现 |
for … of …
实时判定遍历是否终止
1 | const arr = [1, 2]; |
每次遍历前都获取最新的数组, 进入遍历后则不受数组改变影响
1 | const arr = [1, 2]; |
1 | const arr = [1, 2]; |
“for of” 原理: 基于遍历对象具有的 Symbol.iterator 属性.
推测: 自定义属性不在迭代器的范围里, 因此 “for of” 不能遍历出自定义属性.
for … in …
遍历开始前就确定了遍历次数
1 | const arr = [1, 2]; |
遍历对象遭到实时读写
1 | const arr = [1, 2]; |
1 | const arr = [1, 2]; |
“for in” 原理: 取出对象的所有属性名进行遍历, 所以可遍历出自定义属性.
另外, 对于没有值的属性不会取出 (遍历数组时与基础 for 循环的差别) (forEach 也有这个过滤空值的特性), 所以遍历稀疏数组会自动跳过无值的位置.